home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / dns / name.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  14KB  |  594 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import cStringIO
  5. import struct
  6. import sys
  7. if sys.hexversion >= 33751040:
  8.     import encodings.idna as encodings
  9.  
  10. import dns.exception as dns
  11. NAMERELN_NONE = 0
  12. NAMERELN_SUPERDOMAIN = 1
  13. NAMERELN_SUBDOMAIN = 2
  14. NAMERELN_EQUAL = 3
  15. NAMERELN_COMMONANCESTOR = 4
  16.  
  17. class EmptyLabel(dns.exception.SyntaxError):
  18.     pass
  19.  
  20.  
  21. class BadEscape(dns.exception.SyntaxError):
  22.     pass
  23.  
  24.  
  25. class BadPointer(dns.exception.FormError):
  26.     pass
  27.  
  28.  
  29. class BadLabelType(dns.exception.FormError):
  30.     pass
  31.  
  32.  
  33. class NeedAbsoluteNameOrOrigin(dns.exception.DNSException):
  34.     pass
  35.  
  36.  
  37. class NameTooLong(dns.exception.FormError):
  38.     pass
  39.  
  40.  
  41. class LabelTooLong(dns.exception.SyntaxError):
  42.     pass
  43.  
  44.  
  45. class AbsoluteConcatenation(dns.exception.DNSException):
  46.     pass
  47.  
  48.  
  49. class NoParent(dns.exception.DNSException):
  50.     pass
  51.  
  52. _escaped = {
  53.     '"': True,
  54.     '(': True,
  55.     ')': True,
  56.     '.': True,
  57.     ';': True,
  58.     '\\': True,
  59.     '@': True,
  60.     '$': True }
  61.  
  62. def _escapify(label):
  63.     text = ''
  64.     for c in label:
  65.         if c in _escaped:
  66.             text += '\\' + c
  67.             continue
  68.         if ord(c) > 32 and ord(c) < 127:
  69.             text += c
  70.             continue
  71.         text += '\\%03d' % ord(c)
  72.     
  73.     return text
  74.  
  75.  
  76. def _validate_labels(labels):
  77.     l = len(labels)
  78.     total = 0
  79.     i = -1
  80.     j = 0
  81.     for label in labels:
  82.         ll = len(label)
  83.         total += ll + 1
  84.         if ll > 63:
  85.             raise LabelTooLong
  86.         
  87.         if i < 0 and label == '':
  88.             i = j
  89.         
  90.         j += 1
  91.     
  92.     if total > 255:
  93.         raise NameTooLong
  94.     
  95.     if i >= 0 and i != l - 1:
  96.         raise EmptyLabel
  97.     
  98.  
  99.  
  100. class Name(object):
  101.     __slots__ = [
  102.         'labels']
  103.     
  104.     def __init__(self, labels):
  105.         super(Name, self).__setattr__('labels', tuple(labels))
  106.         _validate_labels(self.labels)
  107.  
  108.     
  109.     def __setattr__(self, name, value):
  110.         raise TypeError, "object doesn't support attribute assignment"
  111.  
  112.     
  113.     def is_absolute(self):
  114.         if len(self.labels) > 0:
  115.             pass
  116.         return self.labels[-1] == ''
  117.  
  118.     
  119.     def is_wild(self):
  120.         if len(self.labels) > 0:
  121.             pass
  122.         return self.labels[0] == '*'
  123.  
  124.     
  125.     def __hash__(self):
  126.         h = 0x0L
  127.         for label in self.labels:
  128.             for c in label:
  129.                 h += (h << 3) + ord(c.lower())
  130.             
  131.         
  132.         return int(h % sys.maxint)
  133.  
  134.     
  135.     def fullcompare(self, other):
  136.         sabs = self.is_absolute()
  137.         oabs = other.is_absolute()
  138.         if sabs != oabs:
  139.             if sabs:
  140.                 return (NAMERELN_NONE, 1, 0)
  141.             else:
  142.                 return (NAMERELN_NONE, -1, 0)
  143.         
  144.         l1 = len(self.labels)
  145.         l2 = len(other.labels)
  146.         ldiff = l1 - l2
  147.         if ldiff < 0:
  148.             l = l1
  149.         else:
  150.             l = l2
  151.         order = 0
  152.         nlabels = 0
  153.         namereln = NAMERELN_NONE
  154.         while l > 0:
  155.             l -= 1
  156.             l1 -= 1
  157.             l2 -= 1
  158.             label1 = self.labels[l1].lower()
  159.             label2 = other.labels[l2].lower()
  160.             if label1 < label2:
  161.                 order = -1
  162.                 if nlabels > 0:
  163.                     namereln = NAMERELN_COMMONANCESTOR
  164.                 
  165.                 return (namereln, order, nlabels)
  166.             elif label1 > label2:
  167.                 order = 1
  168.                 if nlabels > 0:
  169.                     namereln = NAMERELN_COMMONANCESTOR
  170.                 
  171.                 return (namereln, order, nlabels)
  172.             
  173.             nlabels += 1
  174.         order = ldiff
  175.         if ldiff < 0:
  176.             namereln = NAMERELN_SUPERDOMAIN
  177.         elif ldiff > 0:
  178.             namereln = NAMERELN_SUBDOMAIN
  179.         else:
  180.             namereln = NAMERELN_EQUAL
  181.         return (namereln, order, nlabels)
  182.  
  183.     
  184.     def is_subdomain(self, other):
  185.         (nr, o, nl) = self.fullcompare(other)
  186.         if nr == NAMERELN_SUBDOMAIN or nr == NAMERELN_EQUAL:
  187.             return True
  188.         
  189.         return False
  190.  
  191.     
  192.     def is_superdomain(self, other):
  193.         (nr, o, nl) = self.fullcompare(other)
  194.         if nr == NAMERELN_SUPERDOMAIN or nr == NAMERELN_EQUAL:
  195.             return True
  196.         
  197.         return False
  198.  
  199.     
  200.     def canonicalize(self):
  201.         return []([ x.lower() for x in self.labels ])
  202.  
  203.     
  204.     def __eq__(self, other):
  205.         if isinstance(other, Name):
  206.             return self.fullcompare(other)[1] == 0
  207.         else:
  208.             return False
  209.  
  210.     
  211.     def __ne__(self, other):
  212.         if isinstance(other, Name):
  213.             return self.fullcompare(other)[1] != 0
  214.         else:
  215.             return True
  216.  
  217.     
  218.     def __lt__(self, other):
  219.         if isinstance(other, Name):
  220.             return self.fullcompare(other)[1] < 0
  221.         else:
  222.             return NotImplemented
  223.  
  224.     
  225.     def __le__(self, other):
  226.         if isinstance(other, Name):
  227.             return self.fullcompare(other)[1] <= 0
  228.         else:
  229.             return NotImplemented
  230.  
  231.     
  232.     def __ge__(self, other):
  233.         if isinstance(other, Name):
  234.             return self.fullcompare(other)[1] >= 0
  235.         else:
  236.             return NotImplemented
  237.  
  238.     
  239.     def __gt__(self, other):
  240.         if isinstance(other, Name):
  241.             return self.fullcompare(other)[1] > 0
  242.         else:
  243.             return NotImplemented
  244.  
  245.     
  246.     def __repr__(self):
  247.         return '<DNS name ' + self.__str__() + '>'
  248.  
  249.     
  250.     def __str__(self):
  251.         return self.to_text(False)
  252.  
  253.     
  254.     def to_text(self, omit_final_dot = False):
  255.         if len(self.labels) == 0:
  256.             return '@'
  257.         
  258.         if len(self.labels) == 1 and self.labels[0] == '':
  259.             return '.'
  260.         
  261.         if omit_final_dot and self.is_absolute():
  262.             l = self.labels[:-1]
  263.         else:
  264.             l = self.labels
  265.         s = '.'.join(map(_escapify, l))
  266.         return s
  267.  
  268.     
  269.     def to_unicode(self, omit_final_dot = False):
  270.         if len(self.labels) == 0:
  271.             return u'@'
  272.         
  273.         if len(self.labels) == 1 and self.labels[0] == '':
  274.             return u'.'
  275.         
  276.         if omit_final_dot and self.is_absolute():
  277.             l = self.labels[:-1]
  278.         else:
  279.             l = self.labels
  280.         s = []([ encodings.idna.ToUnicode(_escapify(x)) for x in l ])
  281.         return s
  282.  
  283.     
  284.     def to_digestable(self, origin = None):
  285.         if not self.is_absolute():
  286.             if origin is None or not origin.is_absolute():
  287.                 raise NeedAbsoluteNameOrOrigin
  288.             
  289.             labels = list(self.labels)
  290.             labels.extend(list(origin.labels))
  291.         else:
  292.             labels = self.labels
  293.         dlabels = [ '%s%s' % (chr(len(x)), x.lower()) for x in labels ]
  294.         return ''.join(dlabels)
  295.  
  296.     
  297.     def to_wire(self, file = None, compress = None, origin = None):
  298.         if file is None:
  299.             file = cStringIO.StringIO()
  300.             want_return = True
  301.         else:
  302.             want_return = False
  303.         if not self.is_absolute():
  304.             if origin is None or not origin.is_absolute():
  305.                 raise NeedAbsoluteNameOrOrigin
  306.             
  307.             labels = list(self.labels)
  308.             labels.extend(list(origin.labels))
  309.         else:
  310.             labels = self.labels
  311.         i = 0
  312.         for label in labels:
  313.             n = Name(labels[i:])
  314.             i += 1
  315.             if compress is not None:
  316.                 pos = compress.get(n)
  317.             else:
  318.                 pos = None
  319.             if pos is not None:
  320.                 value = 49152 + pos
  321.                 s = struct.pack('!H', value)
  322.                 file.write(s)
  323.                 break
  324.                 continue
  325.             if compress is not None and len(n) > 1:
  326.                 pos = file.tell()
  327.                 if pos < 49152:
  328.                     compress[n] = pos
  329.                 
  330.             
  331.             l = len(label)
  332.             file.write(chr(l))
  333.             if l > 0:
  334.                 file.write(label)
  335.                 continue
  336.         
  337.         if want_return:
  338.             return file.getvalue()
  339.         
  340.  
  341.     
  342.     def __len__(self):
  343.         return len(self.labels)
  344.  
  345.     
  346.     def __getitem__(self, index):
  347.         return self.labels[index]
  348.  
  349.     
  350.     def __getslice__(self, start, stop):
  351.         return self.labels[start:stop]
  352.  
  353.     
  354.     def __add__(self, other):
  355.         return self.concatenate(other)
  356.  
  357.     
  358.     def __sub__(self, other):
  359.         return self.relativize(other)
  360.  
  361.     
  362.     def split(self, depth):
  363.         l = len(self.labels)
  364.         if depth == 0:
  365.             return (self, dns.name.empty)
  366.         elif depth == l:
  367.             return (dns.name.empty, self)
  368.         elif depth < 0 or depth > l:
  369.             raise ValueError, 'depth must be >= 0 and <= the length of the name'
  370.         
  371.         return (Name(self[:-depth]), Name(self[-depth:]))
  372.  
  373.     
  374.     def concatenate(self, other):
  375.         if self.is_absolute() and len(other) > 0:
  376.             raise AbsoluteConcatenation
  377.         
  378.         labels = list(self.labels)
  379.         labels.extend(list(other.labels))
  380.         return Name(labels)
  381.  
  382.     
  383.     def relativize(self, origin):
  384.         if origin is not None and self.is_subdomain(origin):
  385.             return Name(self[:-len(origin)])
  386.         else:
  387.             return self
  388.  
  389.     
  390.     def derelativize(self, origin):
  391.         if not self.is_absolute():
  392.             return self.concatenate(origin)
  393.         else:
  394.             return self
  395.  
  396.     
  397.     def choose_relativity(self, origin = None, relativize = True):
  398.         if origin:
  399.             if relativize:
  400.                 return self.relativize(origin)
  401.             else:
  402.                 return self.derelativize(origin)
  403.         else:
  404.             return self
  405.  
  406.     
  407.     def parent(self):
  408.         if self == root or self == empty:
  409.             raise NoParent
  410.         
  411.         return Name(self.labels[1:])
  412.  
  413.  
  414. root = Name([
  415.     ''])
  416. empty = Name([])
  417.  
  418. def from_unicode(text, origin = root):
  419.     if not isinstance(text, unicode):
  420.         raise ValueError, 'input to from_unicode() must be a unicode string'
  421.     
  422.     if not origin is None or isinstance(origin, Name):
  423.         raise ValueError, 'origin must be a Name or None'
  424.     
  425.     labels = []
  426.     label = u''
  427.     escaping = False
  428.     edigits = 0
  429.     total = 0
  430.     if text == u'@':
  431.         text = u''
  432.     
  433.     if text:
  434.         if text == u'.':
  435.             return Name([
  436.                 ''])
  437.         
  438.         for c in text:
  439.             if escaping:
  440.                 if edigits == 0:
  441.                     if c.isdigit():
  442.                         total = int(c)
  443.                         edigits += 1
  444.                     else:
  445.                         label += c
  446.                         escaping = False
  447.                 elif not c.isdigit():
  448.                     raise BadEscape
  449.                 
  450.                 total *= 10
  451.                 total += int(c)
  452.                 edigits += 1
  453.                 if edigits == 3:
  454.                     escaping = False
  455.                     label += chr(total)
  456.                 
  457.             edigits == 3
  458.             if c == u'.' and c == u'\xe3\x80\x82' and c == u'\xef\xbc\x8e' or c == u'\xef\xbd\xa1':
  459.                 if len(label) == 0:
  460.                     raise EmptyLabel
  461.                 
  462.                 labels.append(encodings.idna.ToASCII(label))
  463.                 label = u''
  464.                 continue
  465.             if c == u'\\':
  466.                 escaping = True
  467.                 edigits = 0
  468.                 total = 0
  469.                 continue
  470.             label += c
  471.         
  472.         if escaping:
  473.             raise BadEscape
  474.         
  475.         if len(label) > 0:
  476.             labels.append(encodings.idna.ToASCII(label))
  477.         else:
  478.             labels.append('')
  479.     
  480.     if (len(labels) == 0 or labels[-1] != '') and origin is not None:
  481.         labels.extend(list(origin.labels))
  482.     
  483.     return Name(labels)
  484.  
  485.  
  486. def from_text(text, origin = root):
  487.     if not isinstance(text, str):
  488.         if isinstance(text, unicode) and sys.hexversion >= 33751040:
  489.             return from_unicode(text, origin)
  490.         else:
  491.             raise ValueError, 'input to from_text() must be a string'
  492.     
  493.     if not origin is None or isinstance(origin, Name):
  494.         raise ValueError, 'origin must be a Name or None'
  495.     
  496.     labels = []
  497.     label = ''
  498.     escaping = False
  499.     edigits = 0
  500.     total = 0
  501.     if text == '@':
  502.         text = ''
  503.     
  504.     if text:
  505.         if text == '.':
  506.             return Name([
  507.                 ''])
  508.         
  509.         for c in text:
  510.             if escaping:
  511.                 if edigits == 0:
  512.                     if c.isdigit():
  513.                         total = int(c)
  514.                         edigits += 1
  515.                     else:
  516.                         label += c
  517.                         escaping = False
  518.                 elif not c.isdigit():
  519.                     raise BadEscape
  520.                 
  521.                 total *= 10
  522.                 total += int(c)
  523.                 edigits += 1
  524.                 if edigits == 3:
  525.                     escaping = False
  526.                     label += chr(total)
  527.                 
  528.             edigits == 3
  529.             if c == '.':
  530.                 if len(label) == 0:
  531.                     raise EmptyLabel
  532.                 
  533.                 labels.append(label)
  534.                 label = ''
  535.                 continue
  536.             if c == '\\':
  537.                 escaping = True
  538.                 edigits = 0
  539.                 total = 0
  540.                 continue
  541.             label += c
  542.         
  543.         if escaping:
  544.             raise BadEscape
  545.         
  546.         if len(label) > 0:
  547.             labels.append(label)
  548.         else:
  549.             labels.append('')
  550.     
  551.     if (len(labels) == 0 or labels[-1] != '') and origin is not None:
  552.         labels.extend(list(origin.labels))
  553.     
  554.     return Name(labels)
  555.  
  556.  
  557. def from_wire(message, current):
  558.     if not isinstance(message, str):
  559.         raise ValueError, 'input to from_wire() must be a byte string'
  560.     
  561.     labels = []
  562.     biggest_pointer = current
  563.     hops = 0
  564.     count = ord(message[current])
  565.     current += 1
  566.     cused = 1
  567.     while count != 0:
  568.         if count < 64:
  569.             labels.append(message[current:current + count])
  570.             current += count
  571.             if hops == 0:
  572.                 cused += count
  573.             
  574.         elif count >= 192:
  575.             current = (count & 63) * 256 + ord(message[current])
  576.             if hops == 0:
  577.                 cused += 1
  578.             
  579.             if current >= biggest_pointer:
  580.                 raise BadPointer
  581.             
  582.             biggest_pointer = current
  583.             hops += 1
  584.         else:
  585.             raise BadLabelType
  586.         count = ord(message[current])
  587.         current += 1
  588.         if hops == 0:
  589.             cused += 1
  590.             continue
  591.     labels.append('')
  592.     return (Name(labels), cused)
  593.  
  594.